
// 定数定義
var DEF_DISP_COUNT     = 10;        /* 表示行数 */
var DEF_UPD_INTERVAL   = 60000;     /* 更新間隔(ミリ秒) */
var DEF_NOTIFY_WAIT    = 10000;     /* 通知表示時間(ミリ秒) */
var HOSTNAME = "10.25.113.6:8180";  /* サーバホスト */

/** String拡張 */
String.prototype.rtrim = function() {
    return this.replace(/\s+$/, "");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/, "");
}
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/, "");
}
String.prototype.startsWith = function(prefix) {
  return this.indexOf(prefix) == 0;
};

/** Date拡張 */
Date.prototype.formatJa = function() {
    var ymd = [this.getFullYear(), this.getMonth() + 1, this.getDate()].join("/");
    var m = new String(this.getMinutes());
    if (m.length == 1) m = "0" + m;
    var s = new String(this.getSeconds());
    if (s.length == 1) s = "0" + s;
    var hms = [this.getHours(), m, s].join(":");
    return ymd + " " + hms;
}

/** 今日の日付を保持 */
var today = (function() {
    var d = new Date().formatJa();
    return d.substring(0, d.indexOf(" "));
})();

console.log("今日の日付=" + today);

/*******************************************************************
 * メッセージ表示
 * @param message   表示するメッセージ文字列
 * @param color     メッセージの文字色 (nullの場合は元々の色)
 * @param timer     非表示にする場合の遅延時間 (ミリ秒)
 * @param callback  非表示後に実行する処理
 *******************************************************************/
var Message = (function (){
    return {
        print: function (message, color, timer, callback) {
            var msg = $("#message");
            if (!msg) return null;
            msg.html(message.replace(/\r?\n/g, "<br/>"))
                .css("color", color||msg.css("color"))
                .fadeIn("slow");
            setTimeout(function () {
                msg.fadeOut("5000", callback);
                msg.html("");
            }, timer||3000);
        }
    }
})();

/* アカウント情報 */
var Account = function (name, pass) {
    this.userName = name;
    this.password = pass;
}

/* アカウント情報取得 */
Account.getLoginInfo = function () {
    var userName = localStorage["shovel.user"]||"";
    var password = localStorage["shovel.password"]||"";
    if (!userName || !password) return null;
    return new Account(userName, password);
}

/** Ajax送信の基本設定 */
$.ajaxSetup({
     "async": true
    ,"cache": true
    ,"contentType": "application/x-www-form-urlencoded"
    ,"processData": true
    ,"timeout": 10000
    ,"type": "POST"
});

var Ajax = {};

/*************************************************************************
 * Ajax送信時の標準エラー処理
 * @param ajax      XMLHttpRequestオブジェクト
 * @param callback  エラー処理後に実行する処理
 *************************************************************************/
Ajax.error = function (ajax, callback) {
    if (ajax.statusText === "timeout") {
        Message.print("タイムアウトしました", "red", 3000, function(){self.close();});
    } else {
        Message.print(ajax.status + " " + ajax.statusText, "red", 10000);
    }
}

/*************************************************************************
 * HTTPリクエストヘッダを設定する
 * @param ajax      XMLHttpRequestオブジェクト
 * @param headers   設定するHTTPリクエストヘッダ(連想配列)
 *************************************************************************/
Ajax.setHeaders = function(ajax, headers) {
    if (headers) {
        for (var i in headers) {
            ajax.setRequestHeader(i, headers[i]);
        }
    }
    return true;
}

/*************************************************************************
 * Ajaxによる送信処理
 * @param action    REST APIのアクションパス (URI)
 * @param headers   追加で設定するHTTPリクエストヘッダ(連想配列)
 * @param data      送信データ (POSTパラメータ名=パラメータ値の連想配列)
 * @param success   成功時の処理
 * @param error     エラー時の処理
 * @param account   認証に使用するアカウント情報 (Accountオブジェクト)
 *************************************************************************/
Ajax.send = function (action, headers, data, success, error, account) {

    // ヘッダが指定されている場合はXMLHttpRequestに設定
    var beforeSend = null;
    if (headers) {
        beforeSend = function(ajax){return Ajax.setHeaders(ajax, headers)};
    }

    // アカウント情報が未指定の場合はlocalStorageから取得
    if (!account) account = Account.getLoginInfo();

    // データをPOSTで送信
    $.ajax({
          "url"       : "http://" + HOSTNAME + action
        , "beforeSend": beforeSend
        , "data"      : data
        , "success"   : success
        , "error"     : error? error: Ajax.error
        , "username"  : account? account.userName: null
        , "password"  : account? account.password: null
    });
}
